home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
READTIME.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
11KB
|
292 lines
static char readtime_prog[] = "@(#)char *readtime(int f, char *tstr) - Zeit einlesen";
static char readtime_ver[] = "@(#)v1.20/kr ; 21.07.91";
/* readtime Einlesen eines Zeit-String
**
** Autor Klaus Rath
**
** Deklaration char *readtime(int format, char *timestring);
**
** Compilation DOS: bcc -c readtime.c c:\usr\local\lib\libkrc_s.lib
** UNIX: cc -c readtime.c /u1/usr/lib/libkrc.a
** ( unter DOS kann die Funktion im small-Modell laufen )
**
** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
** chem Format eingelesen werden soll.
** Z.Zt. erlaubte Formate (siehe datum.h) :
** hh:mm[:ss] -- Formate 1,2
** hh.mm[.ss] -- Formate 3,4
** hhmm[ss] -- Datenbankformate 5,6 (DDB/4)
** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
** des Ergebnisses erwartet.
**
** Rückgabe (char *) auf timestring
**
** Anmerkungen Die Funktion prüft nicht die Validität der eingegebenen
** Zeit - dies sollte die aufrufende Funktion selbst tun,
** bzw. den Test durch checktime() durchführen lassen.
** Die Funktion benutzt zum Einlesen eine Funktion
** int editgetch(int form), die einen Tastendruck entsprechend
** dem übergebenen Format form bewertet. Z.Zt. sind folgende
** Formate implementiert ( s. util.h ) :
** ALL (1) - Alle Character 0 - 255
** UPPER (2) - Buchstaben werden in GROSS konvertiert
** LOWER (3) - Buchstaben werden in klein konvertiert
** NUM (4) - Zahlen, '.', ',', '+', '-'
** DATUM (5) - Zahlen, '.', '/', '-'
** ZEIT (6) - Zahlen, '.', ':'
** readtime() stellt dem Aufrufer eine Maske des angeforder-
** ten Format zur Verfügung ( z.B. 00:00:00 ), wobei die
** Unterstriche durch Zahlen gefüllt werden müssen. Die
** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
** nicht editierbar und werden automatisch erzeugt. Eine
** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
** immer, hinter der letzten Position genügt ein beliebige
** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
**
** Änderungen 1.00 ; 09.06.91
** - Erste Version
** 1.10 ; 18.07.91
** - Fehler im Korrekturteil beseitigt.
** - Variable int trenner = ':'||'.' eingefügt.
** 1.20 ; 21.07.91
** - Berücksichtigung eines evtl. bereits eingegebenen
** ersten Zeichens (dazu Variable: int def_char).
** - Taste ESC (27) gibt jetzt einen NULL-Zeiger zurück
** ( tatsächlicher Abbruch !), während RETURN weiterhin
** den vorbelegten bzw. (teil-)ausgefüllten String liefert.
*/
#include <stdio.h>
#include <string.h>
#ifdef __TURBOC__
#define ANSI
#define KR_SYS
#include <stdlib.h>
#include "datum.h"
#include "util.h"
#else
#include "/u1/usr/include/datum.h"
#include "/u1/usr/include/util.h"
#endif
#ifdef ANSI
char *readtime(int format, char *tstring)
#else
char *readtime(format,tstring)
int format;
char *tstring;
#endif
{
/* Variablendefinitionen :
*/
int trennpos1 = 2, /* Positionen von Trennzeichen */
trennpos2 = 5;
int trenner; /* Trennzeichen */
int pos = 0; /* Aktuelle Position */
int maxpos = 11; /* Letztmögliche Position */
int max = 0; /* Schalter, ob am Ende */
int ch; /* Einzulesendes Zeichen */
int def_char = '0'; /* Vorbelegungszeichen */
/* Berücksichtigung eines bereits vorhandenen 1. Zeichens in tstring :
*/
if ( tstring[0] == '\0' ) {
tstring[0] = def_char;
}
else {
pos = 1;
}
/* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
*/
switch ( format ) {
case TI_HM_D :
trenner = 58;
maxpos = 6;
tstring[1] = def_char;
tstring[trennpos1] = trenner;
tstring[3] = def_char;
tstring[4] = def_char;
tstring[5] = '\0';
trennpos2 = 99;
printf("%c0:00",tstring[0]);
printf("\b\b\b\b");
break;
case TI_HM_P :
trenner = 46;
maxpos = 6;
tstring[1] = def_char;
tstring[trennpos1] = trenner;
tstring[3] = def_char;
tstring[4] = def_char;
tstring[5] = '\0';
trennpos2 = 99;
printf("%c0.00",tstring[0]);
printf("\b\b\b\b");
break;
case TI_HMS_P :
trenner = 46;
maxpos = 9;
tstring[1] = def_char;
tstring[trennpos1] = trenner;
tstring[3] = def_char;
tstring[4] = def_char;
tstring[trennpos2] = trenner;
tstring[6] = def_char;
tstring[7] = def_char;
tstring[8] = '\0';
printf("%c0.00.00",tstring[0]);
printf("\b\b\b\b\b\b\b");
break;
case TI_HM_DB :
maxpos = 5;
tstring[1] = def_char;
tstring[2] = def_char;
tstring[3] = def_char;
tstring[4] = '\0';
trennpos1 =
trennpos2 = 99;
printf("%c000",tstring[0]);
printf("\b\b\b");
break;
case TI_HMS_DB :
maxpos = 7;
tstring[1] = def_char;
tstring[2] = def_char;
tstring[3] = def_char;
tstring[4] = def_char;
tstring[5] = def_char;
tstring[6] = '\0';
trennpos1 =
trennpos2 = 99;
printf("%c00000",tstring[0]);
printf("\b\b\b\b\b");
break;
case TI_HMS_D :
default :
trenner = 58;
maxpos = 9;
tstring[1] = def_char;
tstring[trennpos1] = trenner;
tstring[3] = def_char;
tstring[4] = def_char;
tstring[trennpos2] = trenner;
tstring[6] = def_char;
tstring[7] = def_char;
tstring[8] = '\0';
printf("%c0:00:00",tstring[0]);
printf("\b\b\b\b\b\b\b");
break;
} /* ENDE: switch(format) */
/* Evtl. noch ein BACKSPACE ausführen :
*/
if ( !pos ) {
printf("\b");
}
/* Tastendrucke abholen, bis maxpos :
*/
while ( pos < maxpos + 1 ) {
/* Falls fertig, String zurückgeben :
*/
if ( pos == maxpos ) {
tstring[pos] = '\0';
retur